package com.xuecheng.content.config;

import com.alibaba.csp.sentinel.init.InitExecutor;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.xuecheng.content.constant.SentinelConstant;
import com.xuecheng.content.enums.RuleEnum;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * Copyright 2023 ZS Network Co., Ltd. All rights reserved.
 * 本文件仅限于正数网络技术有限公司内部传阅，禁止外泄以及用于其他的商业目的。
 * Created by hes on 2023/11/139:39
 *
 * @author hes
 * 使用sentinel官方网关限流方案，这里注释
 */
//@Component
public class SentinelRuleConfig {
//    @PostConstruct
    private static void initRule() {
        //限流规则
        List<FlowRule> flowRules = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        // 设置每秒请求数阈值
        flowRule.setCount(RuleEnum.COUNT.getValue());
        // 限流模式为 QPS
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 全局资源名，自定义，可根据实际情况设置
        flowRule.setResource(RuleEnum.GLOBAL_RESOURCE.getKey());
        flowRules.add(flowRule);

        FlowRuleManager.loadRules(flowRules);
/**
        //熔断策略-慢调用
        ArrayList<DegradeRule> degradeRules = new ArrayList<>();
        DegradeRule degradeRule = new DegradeRule(RuleEnum.GLOBAL_RESOURCE.getKey());
        ////慢调用比例模式下为慢调用临界 RT（超出该值计为慢调用）
        degradeRule.setCount(SentinelConstant.FIVE_HUNDRED);
        //设置熔断模式，RT为慢调用
        degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
        //熔断时长
        degradeRule.setTimeWindow(SentinelConstant.TEN);
        //慢调用比例阈值，仅慢调用比例模式有效
        degradeRule.setSlowRatioThreshold(0.3);
        //统计时长
        degradeRule.setStatIntervalMs(RuleConstant.DEFAULT_WINDOW_INTERVAL_MS);
        //熔断触发的最小请求数，请求数小于该值时即使异常比率超出阈值也不会熔断
        degradeRule.setMinRequestAmount(SentinelConstant.ONE);
        degradeRules.add(degradeRule);

        DegradeRuleManager.loadRules(degradeRules);

        //降级-异常数
        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule = new DegradeRule();
        // 设置资源名
        rule.setResource(RuleEnum.GLOBAL_RESOURCE.getKey());
        // 熔断策略，这里是异常数策略 支持慢调用比例/异常比例/异常数策略
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
        // 熔断触发的条件是出现两次异常
        rule.setCount(SentinelConstant.TWO);
        // 熔断触发的最小请求数
        rule.setMinRequestAmount(SentinelConstant.THREE);
        // 统计时长 单位是毫秒 默认1000毫秒
        rule.setStatIntervalMs(60 * 1000);
        // 上面这三个条件的的意思是，在一分钟之内，3次请求中如果有两次异常就触发熔断

        // 熔断时长 单位是秒，10秒后会解除熔断，如果10秒后的第一次请求就发生了异常，那么就立刻熔断。
        rule.setTimeWindow(SentinelConstant.TEN);
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
*/
        //异步初始化sentinel
        InitExecutor.doInit();
    }
}
